﻿using System;
using System.ServiceModel;
using System.Security.Permissions;
using Sinacor.Infra.Service.Security.Services;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using System.Collections.Generic;
using Sinacor.Infra.Common.Exceptions.FaultContracts;

namespace Sinacor.Servico.Bovespa.Movimento.Service.ServiceContract
{
    [ExceptionShielding]
    [ServiceContract(Namespace = "http://www.bovespa.com.br/Sinacor.Servico.Bovespa.Movimento.Service.ServiceContract", SessionMode = SessionMode.Allowed)]
    public interface IControleMovimentoOrdens
    {
        #region Membros

        /// <summary>
        /// Esta rotina prepara o Sistema de Ordens, possibilitando a inclusão, processamento e exclusão de ordens e negócios, 
        /// de acordo com os interesses dos clientes
        /// </summary>
        /// <returns>DataContract.Response.DataMovimentoResponse</returns>
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "AbrirMovimento")]
        DataContract.Response.DataMovimentoResponse AbrirMovimento();

        /// <summary>
        /// Retorna a próxima data de movimento calculada para o sistema
        /// </summary>
        /// <returns>DataContract.Response.DataMovimentoResponse</returns>
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "CalcularDataAberturaMovimento")]
        DataContract.Response.DataMovimentoResponse CalcularDataAberturaMovimento();

        /// <summary>
        /// Executa a Consolidação do Movimento de Ordens
        /// </summary>
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ConsolidarMovimento")]
        void ConsolidarMovimento();

        /// <summary>
        /// Encerrar todos os processos pendentes e disponibilizar os negócios realizados para o Faturamento
        /// </summary>
        /// <param name="request">DataContract.Request.DadosFechaMovimentoRequest</param>
        [TransactionRequired]
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "FecharMovimento")]
        void FecharMovimento(DataContract.Request.DadosFechaMovimentoRequest request);

        /// <summary>
        /// Recupera qual o estado do sistema de ordens, "Aberto", "Fechado" ou "Reaberto"
        /// </summary>
        /// <returns>DataContract.Response.EstadoMovimentoResponse</returns>
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ObterEstadoMovimento")]
        DataContract.Response.EstadoMovimentoResponse ObterEstadoMovimento();

        /// <summary>
        /// Recupera informações como data do movimento, estado do movimento para o módulo de Ordens
        /// </summary>
        /// <param name="request">DataContract.Request.DataMovimentoRequest</param>
        /// <returns>DataContract.Response.InformacoesMovimentoResponse</returns>
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ObterInformacoesMovimento")]
        DataContract.Response.InformacoesMovimentoResponse ObterInformacoesMovimento(DataContract.Request.DataMovimentoRequest request);

        /// <summary>
        /// Esta rotina executa a reabertura do Sistema de Ordens, possibilitando a inclusão, 
        /// processamento e exclusão de ordens e negócios, de acordo com os interesses dos clientes, 
        /// desde que as condições necessárias para a reabertura sejam satisfeitas
        /// </summary>
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ReabrirMovimento")]
        void ReabrirMovimento();

        /// <summary>
        /// Executa uma simulação do fechamento do movimento. Muito útil para validar se o fechamento 
        /// possui inconsistências antes de realmente fechá-lo
        /// </summary>
        /// <param name="request">DataContract.Request.DataMovimentoRequest</param>
        /// <returns>DataContract.Response.ResultadoSimulacaoResponse</returns>
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "SimularFechamentoMovimento")]
        DataContract.Response.ResultadoSimulacaoResponse SimularFechamentoMovimento(DataContract.Request.DataMovimentoRequest request);

        /// <summary>
        /// Verifica se existem inconsistências que não impedem o fechamento do movimento (alertas)
        /// </summary>
        /// <param name="request">DataContract.Request.DataMovimentoRequest</param>
        /// <returns>DataContract.Response.ResultadoResponse</returns>
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "VerificarAlertasFechamento")]
        DataContract.Response.ResultadoResponse VerificarAlertasFechamento(DataContract.Request.DataMovimentoRequest request);

        /// <summary>
        /// Remonta o calendario do modulo de Faturamento Bolsas
        /// </summary>
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "RemontarCalendario")]
        void RemontarCalendario();

        #endregion
    }
}
